#include"blockQueue.hpp"
#include <pthread.h>
#include <memory>
#include"task.hpp"
#include <ctime>
using namespace blockQueueModule;
using namespace Task;
void *Consumer(void* args)
{
    auto bq = static_cast<blockQueue<task>*>(args);

    while(true)
    {
        task data;
        // 1. 从 bq中拿到数据
        bq->pop(&data);
        data.exe();
        // 2. 做处理
        sleep(1);
        printf("Consumer 处理完了一个任务 :%d + %d = %d\n", data.X(), data.Y(), data.Ret());
    }

    return nullptr;
}

void *Productor(void* args)
{
    auto bq = static_cast<blockQueue<task>*>(args);

    while (true)
    {
        sleep(2);
        // 1.从外部获取数据
        // 2. 生产到 bq中去 
        // static int data = 10;
        // bq->equeue(data);

        int x = rand() % 10 + 1;
        int y = rand() % 20 + 1;

        task t(x, y);

        bq->equeue(t);
        printf("Productor producted a task call :%d + %d = ?\n", t.X(), t.Y());
    }
    
    return nullptr;
}

int main()
{
    srand(time(nullptr) ^ getpid()) ;
    // zdl:: 1. 实现单生产， 单消费
    auto bq = new blockQueue<task>(5); // 这样他就成为了共享资源
    pthread_t c1, c2, c3, p1, p2;
    pthread_create(&c1, nullptr, Consumer, bq);
    // pthread_create(&c2, nullptr, Consumer, bq);
    // pthread_create(&c3, nullptr, Consumer, bq);
    pthread_create(&p1, nullptr, Productor, bq);
    // pthread_create(&p2, nullptr, Productor, bq);

    pthread_join(c1, nullptr);
    // pthread_join(c2, nullptr);
    // pthread_join(c3, nullptr);
    pthread_join(p1, nullptr);
    // pthread_join(p2, nullptr);

    return 0;
}